var UtilModule = { generate_random_number: function () { return Math.floor(Math.random() * 1000000000) + 1; }, generate_random_string: function (length) { var result = ''; var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var charactersLength = characters.length; for (var i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; }, get_object_index_in_array_by_attr: function (array, attr, value) { if (typeof array !== "undefined") { for (var i = 0; i < array.length; i++) { if (array[i].hasOwnProperty(attr) && array[i][attr] == value) { return i; } } } return -1; }, get_object_in_array_by_attr: function (array, attr, value) { var index = this.get_object_index_in_array_by_attr(array, attr, value); if (index != -1) { return array[index]; } return null; }, get_object_in_array_by_id: function (array, id) { return this.get_object_in_array_by_attr(array, 'id', id); }, get_object_index_in_array_by_id: function (array, id) { return this.get_object_index_in_array_by_attr(array, 'id', id); }, order_array_by_field_asc: function (array, field, order_type) { if (typeof order_type == 'undefined') { order_type = 'default'; } if (order_type == 'int') { return array.sort(function (a, b) { if (parseInt(a[field]) < parseInt(b[field])) { return -1; } if (parseInt(a[field]) > parseInt(b[field])) { return 1; } return 0; }) } return array.sort(function (a, b) { if (a[field] < b[field]) { return -1; } if (a[field] > b[field]) { return 1; } return 0; }) }, get_pretty_word_text: function (word) { word = word.charAt(0).toUpperCase() + word.slice(1); word = word.replaceAll("_", " "); return word; }, format_double: function (number, decimal_digits) { if (typeof decimal_digits === 'undefined') { decimal_digits = 2; } number = parseFloat(number); var is_negative = number < 0; decimal_digits = parseInt(decimal_digits); var number_rounded = +(Math.round(Math.abs(number) + 'e+' + decimal_digits) + 'e-' + decimal_digits); if (is_negative) { number_rounded = -number_rounded; } return number_rounded; }, format_double_force_decimal_digits: function (number, decimal_digits) { if (typeof decimal_digits === 'undefined') { decimal_digits = 2; } number = this.format_double(number, decimal_digits); if (LANG_CODE == 'es') { number = number.toString(); if (number.indexOf('.') === -1) { number += '.00'; } else { var real_digits = number.substr((number.indexOf('.'))).length; for (var i = real_digits; i <= decimal_digits; i++) { number += '0'; } } return number; } }, format_double_show: function (number, decimal_digits) { if (typeof decimal_digits === 'undefined') { decimal_digits = 2; } number = this.format_double(number, decimal_digits); if (LANG_CODE == 'es') { number = number.toString().replace('.', ','); if (number.indexOf(',') === -1) { number += ',00'; } else { var real_digits = number.substr((number.indexOf(','))).length; for (var i = real_digits; i <= decimal_digits; i++) { number += '0'; } } return number; } }, format_double_show_same_decimals_number_has: function (number, min_decimal_digits) { if (typeof min_decimal_digits === 'undefined') { min_decimal_digits = 2; } var decimal_digits = min_decimal_digits; var number_decimal_digits = this.get_n_decimals_number(number); if (number_decimal_digits > decimal_digits) { decimal_digits = number_decimal_digits; } return this.format_double_show(number, decimal_digits); }, get_n_decimals_number: function (number) { var number = number.toString(); var point_index = number.indexOf('.'); if (point_index == -1) { return 0; } if (number.charAt(number.length - 1) == '.') { return 0; } var number_total_length = number.length; return number_total_length - point_index - 1; }, remove_decimals_from_number: function (number) { return Math.trunc(number); }, get_form_data: function (form, attribute) { var disabled = form.find('[disabled]').removeAttr('disabled'); var readonly = form.find('[readonly]').removeAttr('readonly'); var data = form.serializeObject(attribute); disabled.attr('disabled', 'disabled'); readonly.attr('readonly', 'readonly'); return data; }, get_form_data_in_form_data_object: function (form) { var data = form.serializeObject(); var form_data = new FormData(); for (var key in data) { if (data.hasOwnProperty(key)) { form_data.append(key, data[key]); } } form.find("input[type=file]").each(function (index) { if (typeof $(this)[0] !== "undefined" && typeof $(this)[0].files !== "undefined" && typeof $(this)[0].files[0] !== "undefined") { form_data.append($(this).attr("name"), $(this)[0].files[0]); } }); return form_data; }, set_form_data: function (form, data, load_rich_search_data) { if (typeof load_rich_search_data === 'undefined') { load_rich_search_data = true; } if (data != null) { $.each(data, function (name, val) { if (typeof val === 'object' && val != null) { $.each(val, function (name2, val2) { var $el = form.find("[name=" + name + "\\[" + name2 + "\\]]"); if ($el.attr("type") != "file") { $el.val(val2); if (load_rich_search_data) { if ($el.prop("tagName") == "SELECT" && $el.hasClass("rich_search")) { if (typeof val2['explained'] !== "undefined") { SearchModule.set_rich_search_data($el, val2['explained'], true); } else { SearchModule.set_rich_search_value($el, val2, true); } } } } }); } var $el = form.find('[name="' + name + '"]').first(); if (val != null) { if ($el.attr("type") != "file") { $el.val(val); if (load_rich_search_data) { if ($el.prop("tagName") == "SELECT" && $el.hasClass("rich_search")) { if (typeof val['explained'] !== "undefined") { SearchModule.set_rich_search_data($el, val['explained'], true); } else { SearchModule.set_rich_search_value($el, val, true); } } } } } if ($el.length == 2 && val != null && $el.first().hasClass('radio-input')) { $el.filter("[value=" + val + "]").prop('checked', true); } }); } }, form_data_to_object: function (form_data) { var object = {}; form_data.forEach(function (value, key) { if (value == 'null') { value = null; } object[key] = value; }); return object; }, scroll_to_element: function (element, container) { if (typeof container === "undefined") { $([document.documentElement, document.body]).animate({ scrollTop: element.offset().top }, 100); } else { $(container).animate({ scrollTop: element.offset().top - container.offset().top - 100 }, 100); } }, so_is_windows: function () { return window.navigator.platform.indexOf('Win') != -1; }, so_is_mac: function () { return window.navigator.platform.indexOf('MacIntel') != -1; }, get_current_date_time: function () { return this.get_current_date() + ' ' + this.get_current_time(); }, get_current_date: function () { var today = new Date(); return this.get_date_sql_from_date_object(today); }, get_date_sql_from_date_object: function (date_object) { var dd = String(date_object.getDate()).padStart(2, '0'); var mm = String(date_object.getMonth() + 1).padStart(2, '0'); var yyyy = date_object.getFullYear(); return yyyy + '-' + mm + '-' + dd; }, get_current_date_plus_days: function (days) { var today = new Date(); return this.get_date_plus_days(today, days); }, get_date_plus_days: function (date, days) { date.setDate(date.getDate() + parseInt(days)); return this.get_date_sql_from_date_object(date); }, get_days_difference_between_dates: function (date1, date2) { var difference = date1.getTime() - date2.getTime(); var days = difference / (1000 * 3600 * 24); return days; }, get_hours_difference_between_dates: function (date1, date2) { var difference = date1.getTime() - date2.getTime(); var hours = difference / (1000 * 3600); return hours; }, get_minutes_difference_between_dates: function (date1, date2) { var difference = date1.getTime() - date2.getTime(); var minutes = difference / (1000 * 60); return minutes; }, get_seconds_difference_between_dates: function (date1, date2) { var difference = date1.getTime() - date2.getTime(); var seconds = difference / 1000; return seconds; }, get_day_of_date: function (date_string) { return new Date(date_string).getDate(); }, get_month_of_date: function (date_string) { return new Date(date_string).getMonth() + 1; }, get_current_month: function () { return this.get_month_of_date(this.get_current_date()); }, get_year_of_date: function (date_string) { return new Date(date_string).getFullYear(); }, get_current_year: function () { return this.get_year_of_date(this.get_current_date()); }, get_first_week_day_of_date: function (date_string) { var d = new Date(date_string); var day = d.getDay(), diff = d.getDate() - day + (day == 0 ? -6 : 1); return this.get_date_sql_from_date_object(new Date(d.setDate(diff))); }, get_week_day_number_of_date: function (date_string) { return new Date(date_string).getDay(); }, get_week_day_string_of_date: function (date_string) { var number = this.get_week_day_number_of_date(date_string); return _t('javascript_week_day_string_number_' + number); }, get_current_time: function () { var now = new Date(); return this.get_time_from_date_object(now); }, get_time_from_date_object: function (date) { var hh = String(date.getHours()).padStart(2, '0'); var mm = String(date.getMinutes()).padStart(2, '0'); return hh + ':' + mm; }, get_current_timestamp: function () { return this.get_current_timestamp_in_miliseconds(); }, add_days_to_date: function (date, days) { var result = new Date(date); result.setDate(result.getDate() + parseInt(days)); return this.date_object_to_mysql_format(result); }, add_minutes_to_time: function (time, minutes) { var current_date = this.get_current_date(); var date = new Date(current_date + ' ' + time); var new_date = new Date(date.getTime() + minutes * 60000); return this.get_time_from_date_object(new_date); }, date_object_to_mysql_format: function (date) { var year, month, day; year = String(date.getFullYear()); month = String(date.getMonth() + 1); if (month.length == 1) { month = "0" + month; } day = String(date.getDate()); if (day.length == 1) { day = "0" + day; } return year + "-" + month + "-" + day; }, date_from_mysql_to_language_format(date) { var date = new Date(date); var year, month, day; year = String(date.getFullYear()); month = String(date.getMonth() + 1); if (month.length == 1) { month = "0" + month; } day = String(date.getDate()); if (day.length == 1) { day = "0" + day; } if (LANG_CODE == 'es') { return day + "/" + month + "/" + year; } }, date_from_mysql_to_antifraud_law_format(date) { var date = new Date(date); var year, month, day; year = String(date.getFullYear()); month = String(date.getMonth() + 1); if (month.length == 1) { month = "0" + month; } day = String(date.getDate()); if (day.length == 1) { day = "0" + day; } return day + "-" + month + "-" + year; }, in_array_by_field: function (array, field, value) { for (var i = 0; i < array.length; i++) { if (typeof array[i][field] !== 'undefined' && array[i][field] == value) { return array[i]; } } return false; }, open_window: function (url, target) { setTimeout(function () { window.open(url, target); }, 100); }, open_window_post: function (url, data, target) { setTimeout(function () { var form = document.createElement("form"); form.action = url; form.method = "POST"; form.target = target || "_self"; if (data) { for (var key in data) { var input = document.createElement("textarea"); input.name = key; input.value = typeof data[key] === "object" ? JSON.stringify(data[key]) : data[key]; form.appendChild(input); } } form.style.display = 'none'; document.body.appendChild(form); form.submit(); var $form = $(form); $form.remove(); }, 100); }, block_field: function (element) { if (element.hasClass('.rich_search')) { SearchModule.disable_rich_search(element); } else { element.attr('readonly', 'readonly'); element.attr('disabled', 'disabled'); } }, unblock_field: function (element) { if (element.hasClass('.rich_search')) { SearchModule.enable_rich_search(element); } else { element.removeAttr('readonly'); element.removeAttr('disabled'); } }, get_current_url_path: function () { var url = window.location.pathname; url = url.split('?')[0]; url = url.substr(4); url = url.replace(/[0-9]/g, ''); url = UtilModule.string_trim_character(url, '/'); return url; }, string_trim_character: function (s, c) { if (c === "]") c = "\\]"; if (c === "\\") c = "\\\\"; return s.replace(new RegExp( "^[" + c + "]+|[" + c + "]+$", "g" ), ""); }, play_sound: function (url) { var src = url; if (typeof Audio !== 'undefined') { var audio = new Audio(src); audio.play(); } }, get_current_timestamp_in_seconds: function () { return new Date().getTime() / 1000; }, get_current_timestamp_in_miliseconds: function () { return new Date().getTime(); }, get_window_width: function () { return window.innerWidth; }, width_is_less_than_lg: function () { var width = this.get_window_width(); return width < 992; }, width_is_less_than_sm: function () { var width = this.get_window_width(); return width < 576; }, get_slug_from_string: function (str) { str = str.replace(/^\s+|\s+$/g, ''); // trim str = str.toLowerCase(); var from = "àáäâèéëêìíïîòóöôùúüûñç·/_,:;"; var to = "aaaaeeeeiiiioooouuuunc------"; for (var i = 0, l = from.length; i < l; i++) { str = str.replace(new RegExp(from.charAt(i), 'g'), to.charAt(i)); } str = str.replace(/[^a-z0-9 -]/g, '') // remove invalid chars .replace(/\s+/g, '-') // collapse whitespace and replace by - .replace(/-+/g, '-'); // collapse dashes return str; }, replace_strange_characters: function (str) { var rExps = [{ re: /[\xC0-\xC6]/g, ch: 'A' }, { re: /[\xE0-\xE6]/g, ch: 'a' }, { re: /[\xC8-\xCB]/g, ch: 'E' }, { re: /[\xE8-\xEB]/g, ch: 'e' }, { re: /[\xCC-\xCF]/g, ch: 'I' }, { re: /[\xEC-\xEF]/g, ch: 'i' }, { re: /[\xD2-\xD6]/g, ch: 'O' }, { re: /[\xF2-\xF6]/g, ch: 'o' }, { re: /[\xD9-\xDC]/g, ch: 'U' }, { re: /[\xF9-\xFC]/g, ch: 'u' }, { re: /[\xD1]/g, ch: 'N' }, { re: /[\xF1]/g, ch: 'n' }]; for (var i = 0, len = rExps.length; i < len; i++) str = str.replace(rExps[i].re, rExps[i].ch); return str; }, refresh_key_combination: function () { var combination = "Ctrl+F5"; if (UtilModule.so_is_mac()) { combination = "Cmd+R"; } return combination; }, binary_search_object: function (records, x, order, property) { if (typeof order === 'undefined') { order = 'asc'; } if (typeof property === 'undefined') { property = 'id'; } if (!isNaN(parseInt(x))) { x = parseInt(x); } var start = 0, end = records.length - 1; // Iterate while start not meets end while (start <= end) { // Find the mid index var mid = Math.floor((start + end) / 2); if (!isNaN(parseInt(records[mid][property]))) { records[mid][property] = parseInt(records[mid][property]); } // If element is present at mid, return True if (records[mid][property] == x) return records[mid]; // Else look in left or right half accordingly if (order == 'asc') { if (records[mid][property] < x) start = mid + 1; else end = mid - 1; } else { if (records[mid][property] > x) start = mid + 1; else end = mid - 1; } } return null; }, prepare_string_to_filter: function (string) { if (string == null) { string = ''; } string = string.toString(); string = string.trim().toLowerCase().replaceAll(' ', ''); string = this.replace_strange_characters(string); return string; }, any_modal_opened: function () { return $('.modal.show').length > 0; }, str_pad: function (str, len, pad, dir) { var STR_PAD_LEFT = 1; var STR_PAD_RIGHT = 2; var STR_PAD_BOTH = 3; if (typeof (len) == "undefined") { var len = 0; } if (typeof (pad) == "undefined") { var pad = ' '; } if (typeof (dir) == "undefined") { var dir = STR_PAD_RIGHT; } if (len + 1 >= str.length) { switch (dir) { case STR_PAD_LEFT: str = Array(len + 1 - str.length).join(pad) + str; break; case STR_PAD_BOTH: var right = Math.ceil((padlen = len - str.length) / 2); var left = padlen - right; str = Array(left + 1).join(pad) + str + Array(right + 1).join(pad); break; default: str = str + Array(len + 1 - str.length).join(pad); break; } } return str; }, valid_email: function (email) { return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email) }, string_contains_only_letters_numbers: function (str) { var regex = /^[A-Za-z0-9]+$/ var valid = regex.test(str); return valid; }, strip_html: function (html) { var tmp_div = document.createElement("div"); tmp_div.innerHTML = html; return tmp_div.textContent || tmp_div.innerText || ""; }, update_query_string_parameter: function (uri, key, value) { var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i"); var separator = uri.indexOf('?') !== -1 ? "&" : "?"; if (uri.match(re)) { return uri.replace(re, '$1' + key + "=" + value + '$2'); } else { return uri + separator + key + "=" + value; } }, user_agent_is_mobile_or_tablet: function () { let check = false; (function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true; })(navigator.userAgent || navigator.vendor || window.opera); return check; }, user_agent_is_ios: function () { return [ 'iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod' ].includes(navigator.platform) // iPad on iOS 13 detection || (navigator.userAgent.includes("Mac") && "ontouchend" in document) }, get_boolval_of_string: function (string) { if (string === '0' || string === 'false') { return false; } return Boolean(string); }, get_text_of_boolval: function (value) { if (value === '0' || value === 'false' || value === 0 || value === false) { return _t('no'); } return _t('yes'); }, extract_css_rules_from_page_as_text: function (convert_relative_urls_to_absolute, files) { if (typeof convert_relative_urls_to_absolute === 'undefined') { convert_relative_urls_to_absolute = false; } if (typeof files === 'undefined') { files = null; } var css = ''; var styleSheets = Array.from(document.styleSheets).filter( (styleSheet) => !styleSheet.href || styleSheet.href.startsWith(window.location.origin) ); $.each(styleSheets, function (sheetIndex, sheet) { var file_found = true; if (files != null) { file_found = false; for (var i = 0; i < files.length; i++) { if (sheet.href.includes(files[i])) { file_found = true; } } } if (file_found) { $.each(sheet.cssRules || sheet.rules, function (ruleIndex, rule) { var css_text = rule.cssText; if (convert_relative_urls_to_absolute) { if (css_text.includes('url("/')) { css_text = css_text.replace('url("/', 'url("' + window.location.origin + '/'); } } css += css_text += '\n'; }); } }); return css; }, reload_without_query_string() { window.location.href = window.location.href.split('?')[0]; }, is_valid_spanish_vat: function (str) { var DNI_REGEX = /^(\d{8})([A-Z])$/; var CIF_REGEX = /^([ABCDEFGHJKLMNPQRSUVW])(\d{7})([0-9A-J])$/; var NIE_REGEX = /^[XYZ]\d{7,8}[A-Z]$/; var spanish_vat_type = function (str) { if (str.match(DNI_REGEX)) { return 'dni'; } if (str.match(CIF_REGEX)) { return 'cif'; } if (str.match(NIE_REGEX)) { return 'nie'; } }; var valid_dni = function (dni) { var dni_letters = "TRWAGMYFPDXBNJZSQVHLCKE"; var letter = dni_letters.charAt(parseInt(dni, 10) % 23); return letter == dni.charAt(8); }; var valie_dni_e = function (nie) { /** * Change the initial letter for the corresponding number and validate as DNI */ var nie_prefix = nie.charAt(0); switch (nie_prefix) { case 'X': nie_prefix = 0; break; case 'Y': nie_prefix = 1; break; case 'Z': nie_prefix = 2; break; } return valid_dni(nie_prefix + nie.substr(1)); }; var valid_cif = function (cif) { var match = cif.match(CIF_REGEX); var letter = match[1], number = match[2], control = match[3]; var even_sum = 0; var odd_sum = 0; var n; for (var i = 0; i < number.length; i++) { n = parseInt(number[i], 10); if (i % 2 === 0) { n *= 2; odd_sum += n < 10 ? n : n - 9; } else { even_sum += n; } } var control_digit = (10 - (even_sum + odd_sum).toString().substr(-1)) % 10; var control_letter = 'JABCDEFGHI'.substr(control_digit, 1); if (letter.match(/[ABEH]/)) { return control == control_digit; } else if (letter.match(/[KPQS]/)) { return control == control_letter; } else { return control == control_digit || control == control_letter; } }; str = str.toUpperCase(); var valid = false; var type = spanish_vat_type(str); switch (type) { case 'dni': valid = valid_dni(str); break; case 'nie': valid = valie_dni_e(str); break; case 'cif': valid = valid_cif(str); break; } return valid; } }; String.prototype.replaceAll = function (search, replacement) { var target = this; return target.replace(new RegExp(search, 'g'), replacement); };